package modelo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
//import vista.VistaUsuario;
public class ConexionBD {

		Connection con;
		//Statement sent;
		//Statement sent2;
		PreparedStatement psInserCat;
		PreparedStatement psInserCli;	
		PreparedStatement psInserOrden;	
		PreparedStatement psInserProd;
		PreparedStatement psInsertIngre;
		PreparedStatement psInsertOrdenProd;
		PreparedStatement psInsertIngrePro;
		PreparedStatement psConsultaCodIngrediente;
		PreparedStatement psConsultaCodCategoria;
		
		Statement stmt;
		
		ResultSet recordSet;
		ResultSet recordSet2;
		//ResultSetMetaData rsmd;
		
		public ConexionBD() throws SQLException,ClassNotFoundException{
		

			        Class.forName("org.postgresql.Driver");
					con=DriverManager.getConnection("jdbc:postgresql://localhost:5432/BD1-2","postgres","inginfo230689");
					con.setAutoCommit(false);
					psInserCli=con.prepareStatement("INSERT INTO cliente VALUES(?,?,?,?,?,?);");
				    psInserCat=con.prepareStatement("INSERT INTO categoria VALUES(?,?);");
				    psInserOrden=con.prepareStatement("INSERT INTO orden VALUES(?,?,?,?);");
				    psInserProd=con.prepareStatement("INSERT INTO producto VALUES(?,?,?,?,?);");
				    psInsertIngre=con.prepareStatement("INSERT INTO ingrediente  VALUES(?,?,?);");
				    psInsertOrdenProd=con.prepareStatement("INSERT INTO ordenproducto VALUES(?,?,?);");
				    psInsertIngrePro=con.prepareStatement("INSERT INTO ingredienteproducto VALUES(?,?,?);");
				    psConsultaCodIngrediente=con.prepareStatement("SELECT codingrediente FROM ingrediente WHERE descripcion = ?");
				    psConsultaCodCategoria=con.prepareStatement("SELECT codcategoria FROM categoria WHERE descripcion = ?");
			}
		
		public void insetarDatosCliente(Cliente cli){
			
			try {
				
				psInserCli.setString(1,cli.getCedula());
				psInserCli.setString(2,cli.getNombre());
				psInserCli.setString(3,cli.getApellido());
				psInserCli.setString(4,cli.getDireccion());
				psInserCli.setString(5,cli.getTelefono());
				psInserCli.setString(6,cli.getEMail());
		
				
				psInserCli.execute();
				
				
				psInserCli.close();
				con.commit();
			
			} catch (SQLException e) {
				System.out.println("Error insertando datos en la tabla cliente");
				e.printStackTrace();
				
				try {
					con.rollback();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
				
			}
	}

		
public void insetarDatosCategoria(Categoria cat){
			
			try {
				
				psInserCat.setString(1,cat.getCategoria());
				psInserCat.setString(2,cat.getDescripcion());		
				
				psInserCat.execute();
				psInserCat.close();
				con.commit();
			
			} catch (SQLException e) {
				System.out.println("Error insertando datos en la tabla categoria");
				e.printStackTrace();
				
				try {
					con.rollback();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
				
			}
	}

public void insetarDatosProducto(Producto pro){
	
	try {
		
		psInserProd.setString(1,pro.getCodProducto());
		psInserProd.setString(2,pro.getCodCategoria());
		psInserProd.setString(3,pro.getDescripcion());
		psInserProd.setFloat(4,pro.getPrecio());
		psInserProd.setString(5,pro.getFechaRegistro());
		
		psInserProd.execute();

		
		psInserProd.close();
		con.commit();
	
	} catch (SQLException e) {
		System.out.println("Error insertando datos en la tabla producto");
		e.printStackTrace();
		
		try {
			con.rollback();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
	}
}


public void insetarDatosIngrediente(Ingrediente ingre){
	
	try {
		
		psInsertIngre.setString(1,ingre.getCodIngrediente());
		psInsertIngre.setString(2,ingre.getDescripcion());
		psInsertIngre.setFloat(3,ingre.getExistencia());

		psInsertIngre.execute();
		
		psInsertIngre.close();
		con.commit();
	
	} catch (SQLException e) {
		System.out.println("Error insertando datos en la tabla ingrediente");
		e.printStackTrace();
		
		try {
			con.rollback();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
	}
}


public void insetarDatosOrden(Orden ord){
	
	try {
		
		psInserOrden.setString(1,ord.getCodOrden());
		psInserOrden.setString(2,ord.getCedula());
		psInserOrden.setString(3,ord.getFecha());
		psInserOrden.setFloat(4,ord.getTotalPagar());
	
		psInserOrden.execute();	
		psInserOrden.close();
		con.commit();
	
	} catch (SQLException e) {
		System.out.println("Error insertando datos en la tabla orden");
		e.printStackTrace();
		
		try {
			con.rollback();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
	}
}
public Vector<String> cargarIngredientes(){
	Vector<String> vIngredientes;
	vIngredientes= new Vector<String>();
	try {
		stmt=con.createStatement();
		String ingredientes="SELECT * FROM ingrediente;";
		ResultSet rs=stmt.executeQuery(ingredientes);
		String des;
		while(rs.next()){
			des=rs.getString("descripcion");
			vIngredientes.add(des);
		}
		stmt.close();
		con.close();
		//return vSubDewey;
	} catch (SQLException ex) {
		System.out.println("Error al cargar los ingredientes");
		ex.printStackTrace();
		
	}catch(Exception e){
		e.printStackTrace();
		System.out.println("Error general");
	}
	return vIngredientes;
}
public Vector<String> cargarCategorias(){
	Vector<String> vCategorias;
	vCategorias= new Vector<String>();
	try {
		stmt=con.createStatement();
		String categorias="SELECT * FROM categoria;";
		ResultSet rs=stmt.executeQuery(categorias);
		String des;
		while(rs.next()){
			des=rs.getString("descripcion");
			vCategorias.add(des);
		}
		stmt.close();
		con.close();
	} catch (SQLException ex) {
		System.out.println("Error al cargar las categorias");
		ex.printStackTrace();
		
	}catch(Exception e){
		e.printStackTrace();
		System.out.println("Error general");
	}
	return vCategorias;
}
public void InsertarIngredientesProducto(Vector<DetalleProducto> detallesProducto){
DetalleProducto detalle;
try {
		for(int i=0;i< detallesProducto.size();i++){
			detalle=detallesProducto.elementAt(i);
	psInsertIngrePro.setString(1,detalle.getCodProducto());
	psInsertIngrePro.setString(2,detalle.getCodIngrediente());
	psInsertIngrePro.setFloat(3,detalle.getCantidad());
	psInsertIngrePro.execute();
		}
		psInsertIngrePro.close();
		con.commit();
	
	} catch (SQLException e) {
		System.out.println("Error insertando datos en la tabla orden");
		e.printStackTrace();
		
		try {
			con.rollback();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		
	}
}
public String ObtenerCodIngrediente(String nombreIngrediente){
	ResultSet rs;
	String codingrediente="";
	try {
		psConsultaCodIngrediente.setString(1,nombreIngrediente);
		rs=psConsultaCodIngrediente.executeQuery();
		rs.next();
		codingrediente=rs.getString("codingrediente");
		rs.close();
		psConsultaCodIngrediente.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
return codingrediente;		
	}
public String ObtenerCodCategoria(String nombreCategoria){
	ResultSet rs;
	String codcategoria="";
	try {
		psConsultaCodCategoria.setString(1,nombreCategoria);
		rs=psConsultaCodCategoria.executeQuery();
		rs.next();
		codcategoria=rs.getString("codcategoria");
		rs.close();
		psConsultaCodCategoria.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
return codcategoria;		
	}
/*public Vector cargarLibroConsultado(Libro L){
	Vector vLibro;
	vLibro= new Vector();
	String cota;
	Vector vLibroPrincipal = new Vector();
	//String empleos[] = new String[90];
	try {
		sent=con.createStatement();
		cota=L.getCota().toString();

		String subD="SELECT * FROM Libro WHERE Cota='"+cota+"';";
		recordSet=sent.executeQuery(subD);
		
		while(recordSet.next()){
			//System.out.println(recordSet.getString(1));
			vLibro.addElement(recordSet.getString(1));
			vLibro.addElement(recordSet.getString(2));
			vLibro.addElement(recordSet.getString(3));
			vLibro.addElement(recordSet.getString(4));
			vLibro.addElement(recordSet.getString(5));
			int nej=recordSet.getInt(6);
			String NEJ = new Integer(nej).toString();
			vLibro.addElement(NEJ);	
			int ano=recordSet.getInt(7);
			String ANO = new Integer(ano).toString();
			vLibro.addElement(ANO);		
			int nejd=recordSet.getInt(8);
			String NEJD = new Integer(nejd).toString();
			vLibro.addElement(NEJD);				
			vLibro.addElement(recordSet.getString(9));
			vLibro.addElement(recordSet.getString(10));
			int id=recordSet.getInt(11);
			String ID = new Integer(id).toString();
			vLibro.addElement(ID);
			vLibroPrincipal.addElement(new Vector(vLibro));
			vLibro.removeAllElements();

		}
		recordSet.close();

		sent.close();
		//return vSubDewey;
	} catch (SQLException ex) {
		System.out.println("Error mostrando datos del Dewey");
		ex.printStackTrace();
		
	}catch(Exception e){
		e.printStackTrace();
		System.out.println("Error general");
	}
	return vLibroPrincipal;
}
			
	public void insetarDatosEquipo(Equipo e){
			
			try {
				
				psInserEqui.setInt(1,e.getIdequipo());
				psInserEqui.setInt(2,e.getIdliga());
				psInserEqui.setString(3,e.getNombre());
				psInserEqui.setString(4,e.getEstatus());
				psInserEqui.setInt(5,e.getCantjugadores());				

				psActuaLiga.setInt(1,e.getIdliga());
				
				psInserEqui.execute();
				psActuaLiga.executeUpdate();
				
				//psInserEqui.close();
				//psActuaLiga.close();
				con.commit();
			
			} catch (SQLException ex) {
				System.out.println("Error insertando datos en la tabla Equipo");
				ex.printStackTrace();
				
						try {
							con.rollback();
						} catch (SQLException e1) {
							e1.printStackTrace();
						}
			}
	}


	public void insetarDatosJugador(Jugador j){
		
		try {
			
			psInserJuga.setInt(1,j.getIdjugador());
			psInserJuga.setInt(2,j.getIdequipo());
			psInserJuga.setString(3,j.getNombre());
			psInserJuga.setInt(4,j.getEdad());
			psInserJuga.setInt(5,j.getNumero());		
			psInserJuga.setInt(6,j.getAvg());
			psInserJuga.setString(7,j.getEstatus());
			
			psActuaEqui.setInt(1,1);
			psActuaEqui.setInt(2,j.getIdequipo());
			
			psInserJuga.execute();
			psActuaEqui.executeUpdate();
			
			//psInserEqui.close();
			//psActuaLiga.close();
			con.commit();
			
		} catch (SQLException ex) {
			System.out.println("Error insertando datos en la tabla Jugador");
			ex.printStackTrace();
			
			try {
				con.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}


	public void eliminarDatosJugador(Jugador ju){
		
		try {
			psElimiJuga.setInt(1,ju.getIdjugador());		
			
			psActuaEqui.setInt(1,-1);
			psActuaEqui.setInt(2,ju.getIdequipo());
			
			psElimiJuga.execute();
			psActuaEqui.executeUpdate();
			
			//psInserEqui.close();
			//psActuaLiga.close();
			con.commit();
			
		} catch (SQLException ex) {
			System.out.println("Error eliminando datos en la tabla Jugador");
			ex.printStackTrace();
			
			try {
				con.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}
	
	
	
	
	public void mostrarLibro(){
		
		try {
			sent=con.createStatement();
			sent2=con.createStatement();
						//idliga=1 porque solo se le inserto jugadores a una liga
			
			String Libro = "SELECT * FROM  Libro WHERE Libro.Cota = ";

			recordSet=sent.executeQuery(equ);
			
			System.out.println("");
			
			while(recordSet.next()){
				System.out.println();
				System.out.println("\t\t\tEQUIPO: "+recordSet.getString(2));
				System.out.println("NOMBRE\t\t AVG");
				String jug=jug1 + Integer.toString(recordSet.getInt(1)) +";";
				//System.out.println(jug);
				recordSet2=sent2.executeQuery(jug);
				while(recordSet2.next())
					System.out.println(recordSet2.getString(3)+"\t"+recordSet2.getInt(6));
				
			}
			//psInserCuerpo.close();
			recordSet.close();
			recordSet2.close();
			sent.close();
			sent2.close();
		} catch (SQLException ex) {
			System.out.println("Error mostrando datos de los jugadores por Equipo");
			ex.printStackTrace();
			
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("Error general");
		}
		
	}
	
	
	public Connection conn;
	public ResultSet rs;
	
	public VistaConsulta vConsulta;

	public ModeloRecibo() {
		super();
	}
	
	public ModeloRecibo(VistaConsulta vConsulta) {
		super();
		this.vConsulta = vConsulta;
	}

	public boolean registarRecibo(){
		
		boolean sw = false;
		
		String sql="INSERT INTO Recibo VALUES(null,'"+getTipoMascota() +
        "','"+getNbMascota() + "','" + getCdServicio() + "'," +
        getTotalPagar() + ", '" + getSexo() + "','A','"+  getNbUsuario() + "')";
		
		conn = crearConexion();
		sw = actualizarDatos(conn, sql);
		realizarCambios(conn);
		cerrarConexion(conn);
		return sw;
		
	}

	public boolean eliminarReciboPago(int numrecibo){
		boolean sw = false;
		
		String sql="UPDATE Recibo SET estatus = 'E' WHERE numrecibo=" + numrecibo + " and estatus = 'A'";
		conn = crearConexion();
		sw = actualizarDatos(conn, sql);
		realizarCambios(conn);
		cerrarConexion(conn);
		return sw;
		
	}
	
	
	public void consultarRecibos() {
		// se crean dos vectores uno para el titulo de la tabla y el otro para el resultado de la consulta que se llenara dinamicamente
		Vector titulos = new Vector(7);
		Vector resultados = new Vector();
		
		String sql = "SELECT * FROM Recibo WHERE estatus='A'" ;	

		conn = crearConexion();
		rs = consultarDatos(conn, sql);
		
		try{
			while(rs.next()){
				//El resultado de la consulta la va adicionando al vector
				Vector resultado = new Vector();
				
				
				resultado.add(rs.getString("numrecibo"));
	            resultado.add(rs.getString("tipomascota"));
				resultado.add(rs.getString("nbmascota"));
				resultado.add(rs.getString("sexo"));
				resultado.add(rs.getInt("cdservicio"));
				resultado.add(rs.getDouble("totalpagar"));
				resultado.add(rs.getString("nbusuario"));	
				//vacia el resultado del vector interno (resultado) en el vector resultados
				resultados.add(resultado);
		
			}
			
			cerrarConexion(conn);
		}catch(SQLException e){
			e.printStackTrace();		
			
		}
		//adiciona los titulos de la tabla al vector titulos
		titulos.add("#Recibo");
		titulos.add("Tipo Mascota");
		titulos.add("Nombre Mascota");
		titulos.add("Sexo");
		titulos.add("Servicio Prestado");
		titulos.add("Costo Servicio");
		titulos.add("Usuario");
		
		// la interfaz TableModel posee metodos de JTable.
		// DefaultTableModel es clase hija de AbstractTableModel que posee metodos para trabajar con tablas
		TableModel modelo = new DefaultTableModel(resultados, titulos)
		{
			public boolean isCellEditable(int row,int col){
				if(col>=0)
					return false;
				else{
					return true;
				}
			}
		};
		
		//vacio en la tabla de la vista el resultado de la consulta
		vConsulta.resultado.setModel(modelo); 
		vConsulta.resultado.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // para que pueda seleccionar solo una fila a la vez
		vConsulta.resultado.isCellEditable(1,0); 
		vConsulta.resultado.getTableHeader().setReorderingAllowed(false);// para que no pueda cambiar en ejecucion el orden de las columnas titulos con resultados
		if(resultados.size()!=0)
			vConsulta.resultado.setRowSelectionInterval(0,0);// para que aparezca seleccionada por defecto la primera fila
			
	}
	}
public Vector consultarLibro(String rango,String columna){
	resul = null;
	Vector vectorDatos = new Vector();
    Vector vectorDatosAux = new Vector();
	
    System.out.println("entro a consultar libro");
    con = crearConexion();
    
    if (rango.equalsIgnoreCase("")){
    	String tiraSql = "SELECT * FROM Libro , Autor WHERE Libro.idAutor = Autor.idAutor;";
		System.out.println(tiraSql);
		resul = cargarSGenerico(con,tiraSql);
	}else{
			
		String tiraSql = "SELECT * FROM Libro , Autor WHERE "+columna+" LIKE '%"+rango+"%' and Libro.idAutor = Autor.idAutor;";
		System.out.println(tiraSql);
		resul = cargarSGenerico(con,tiraSql);
	}
    try {                              
        while(resul.next()){
        	System.out.println("realiza un nex");
            
        	vectorDatosAux.add(resul.getString("nombre"));  
            vectorDatosAux.add(resul.getString("Apellido"));  
            vectorDatosAux.add(resul.getString("tituloLibro"));
            vectorDatosAux.add(resul.getString("descripcion"));
            vectorDatosAux.add(resul.getInt("anioPublicacion"));
            vectorDatosAux.add(resul.getInt("idSubDewey"));
            vectorDatosAux.add(resul.getString("cota"));                                    
            
            vectorDatos.addElement(new Vector(vectorDatosAux));
            vectorDatosAux.removeAllElements();
        }                         
    }catch (SQLException sqle){
        sqle.printStackTrace();             
    }
    
	
	cerrarConexion(con);
	return vectorDatos;
}



	public void cerrarTodo(){
		try {
			psInserEmpl.close();
			psInserLibr.close();
			con.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("No se pudo cerrar!!!");
		}
	}*/
}


